from django.shortcuts import render

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
import hashlib
import xml.etree.ElementTree as ET
from django.conf import settings

#JsonResponse
from django.http import JsonResponse

# Create your views here.
# views.py

from django.shortcuts import render, get_object_or_404
# from .models import Bill
from .models import VehicleRecord


def payment_view(request, id):
    print("-------------------------------------")
    print("payment_view")
    vr = get_object_or_404(VehicleRecord, id=id)
    return render(request, 'payment.html', {'vr': vr})



def find_view(request):
    if request.method == 'POST':
        print("find_view post ......................")
        license_plate = request.POST.get('license_plate')

        print(license_plate)
        # 从数据库表 VehicleRecord中按照车牌查询最近一次没支付的记录
        vr = VehicleRecord.objects.filter(license_plate=license_plate, payment_status='pending').last()
        
        print(vr)
        if vr is None:
            # return JsonResponse({'status': 404, 'message': '未查询到未支付的记录'})
            response_data = {
                'status': 404,
                'message': '未查询到记录',
            }
        else:
            response_data = {
                'status': 200,
                'message': '查询成功',
                'id': vr.id,
                # 'entry_time': vr.entry_time,
                # 'license_plate': vr.license_plate,
                # 'fee': vr.fee,
                # 'payment_link': vr.payment_link,
            }
        # 跳转到 payment2.html
        # redirect payment2.html
        print(response_data)
        return JsonResponse(response_data)
        # return HttpResponse( 'payment2.html', response_data)
    else:
        # return JsonResponse({'status': 400, 'message': '请求方法错误'})
        print("-------------------------------------")
        print("get find_view")
        return render(request, 'find.html')


@csrf_exempt
def payment_notification(request):
    if request.method == 'POST':
        # 获取POST请求体
        xml_data = request.body
        # 解析XML
        xml_dict = parse_xml_to_dict(xml_data)

        # 1. 验证请求的真实性（例如, 对于微信支付, 验证签名）
        api_key = settings.API_KEY
        if not verify_signature(xml_dict, api_key):
            return HttpResponse('Signature verification failed', status=403)

        # 2. 解析支付结果
        payment_result = xml_dict['result_code']

        # 3. 根据支付结果更新订单状态
        if payment_result == 'SUCCESS':
            order_id = xml_dict['out_trade_no']
            update_order_status(order_id, 'paid')

        # 4. 返回响应给支付平台, 例如微信支付要求返回特定的XML格式响应
        return HttpResponse('<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>', content_type='text/xml')
    else:
        # 非POST请求, 返回错误
        return HttpResponse('Invalid Request', status=400)
    


def parse_xml_to_dict(xml_data):
    """将XML数据解析为字典"""
    root = ET.fromstring(xml_data)
    return {child.tag: child.text for child in root}

def verify_signature(xml_dict, api_key ):
    """验证签名（这里需要根据实际情况实现签名验证逻辑）"""
    # 假设签名验证逻辑
    # return True

    """
    验证微信支付通知的签名
    :param xml_dict: 解析支付通知XML得到的字典
    :param api_key: 微信商户平台设置的API密钥
    :return: 验证结果,True表示验证通过, False表示验证失败
    """
    # 从参数中移除sign
    if 'sign' not in xml_dict:
        return False
    sign = xml_dict.pop('sign')
    
    # 按照字段名的ASCII码从小到大排序后, 使用URL键值对的格式拼接成字符串
    sorted_params = sorted(xml_dict.items())
    stringA = "&".join(["{}={}".format(k, v) for k, v in sorted_params])
    
    # 在stringA最后拼接上key得到stringSignTemp字符串, 并对stringSignTemp进行MD5运算, 再将得到的字符串所有字符转换为大写
    stringSignTemp = "{}&key={}".format(stringA, api_key)
    signValue = hashlib.md5(stringSignTemp.encode("utf-8")).hexdigest().upper()
    
    # 比较计算得到的签名值与通知中的签名值
    return sign == signValue


def update_order_status(order_id, status):
    """根据支付结果更新订单状态（这里需要根据实际情况实现订单状态更新逻辑）"""
    # 假设更新订单状态的逻辑
    # return True
    vr = VehicleRecord.objects.get(payment_link=order_id)
    vr.payment_status = status
    vr.save()
